PICターゲット・ボードのチェック編 その1
(LEDを点灯させる)
LEDを点灯させてボードをチェックしてみよう!
RBポート:全LED点灯動作
RBポートの全LED点灯動作については、これまで述べてきました。以下にプログラムリストを示します。
(注)以下に示すプログラムには、ホームページ画面作成の都合上、空白として全角文字のスペースなどが挿入されています。したがって、下記プログラムリストをそのままコピーしてMPLABのソースファイルとされた場合には、エラーとなることがあります。
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「port_b.asm」 サイズ543バイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「port_b.hex」 サイズ46バイト
;***************************************************** ; Port B 動作チェックプログラム ; Port B の発光ダイオードを点灯させる ;***************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC ORG 0 BSF STATUS,RP0 CLRF TRISB BCF STATUS,RP0 MOVLW 0FFH MOVWF PORTB END |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 ; ;(3)プログラムの開始番地の指定 ;(4)Bank 1 へ切替 ;(5)PortB 全ポートを出力に設定 ;(6)Bank 0 へ戻す ;(7)11111111を Wreg にロードする ;(8)PORTBへWregのデータを出力 ;(9)終了 |
【プログラムの説明】
このプログラムについて、順を追って解説を加えておきましょう。
(1)プロセッサの種別指定
定義の仕方は「PROCESSOR」か「LIST」命令を使って設定します。ここで指定するプロセッサ名称は、パッケージの種類を示すサフィックス(最後の英記号の部分)は不要です。
LIST P=PIC16F877
または
PROCESSOR PIC16F877
(2)標準ヘッダーファイルのインクルード
標準ヘッダーファイルとは、各プロセッサが持っているSFR(Special
Function Register)をラベル(記号)で使える様にするため、ラベルとハードウェアの場所とを定義しているファイルです。標準ヘッダーファイルは 「プロセッサ名.INC」というファイル名で統一されて、MPLABのディレクトリに格納されています。従って、これのインクルード方法は下記のようにして行います。
一度、参考までに標準ヘッダーファイルの内容をエディタ等で見ておくことをお勧めします。
INCLUDE P16F877.INC
または
#INCLUDE P16F877.INC
(3)プログラムの開始番地の指定
「ORG」はプログラムの開始番地を指定する擬似命令で、ORG以下の実際のプログラム命令が格納されるプログラムメモリ内の位置(アドレス)を指定します。今回はひとつのプログラムから構成されているので最初に1回だけ指定すれば良いことになります。
ORG 0 ;0番地から格納することを示します。
コンピュータは一般に電源投入時やリセットをすると必ず0番地からスタートするようになっているので、0番地には必ず命令があることが必要です。
(4)Bank 1 へ切替
PICには各種の動作モードを設定するための Special
Register と呼ばれるものが用意されています。PICを動作させるためには、まずこのSpecial
Registerの設定から始めます。そしてそれらは全て、Register
File と呼ぶメモリとして用意されています。その
Register Fileは Bank0, Bank1, Bank2, Bank3
とよばれるアドレス空間をもっているため、多少アクセスの仕方が面倒です。つまりRESET後の通常はBank0となっているので、Bank1側のレジスタにアクセスするときはBankの切替えをしてからとなります。またBank0とBank1に同じ物があるときにはどちらでも同じ様に使えます。
Bank1へ切り替える方法ですが、「STATUS」レジスタにある2ビットのRP0、RP1を変えてBankを指定します。デフォルトは、Bank0です。表1にBankとRP1,RP0ビットとの関係を示します。Bank1へ切り替えるためには、RP0ビットを「1」にします。(RP1はデフォルトで「0」なので変える必要はない。)
BSF STATUS,RP0
「STATUS」レジスタのRP0ビットを「1」にする。
Bank | RP1 | RP0 |
0 | 0 | 0 |
1 | 0 | 1 |
2 | 1 | 0 |
3 | 1 | 1 |
(5)PortB 全ポートを出力に設定
PIC16F877には、I/Oポートが5組用意されています。入出力モードの設定は、それぞれのI/Oポートのピン1本1本を独立して入力か出力かプログラムで決めることができ、TRISA,
TRISB, TRISC, TRISD, TRISE という特別なレジスタ(SRF)に設定します。このTRISxレジスタの各ビットが、対応する各ポートPORTxの同じ位置のビットの入出力モードを決定します。PORTxのビットを出力に設定する時には、TRISxの対応するビットを「0」に設定します。入力に設定する時には、「1」に設定しますが、電源ON後やRESET後はすべて「入力」として設定されています。
それでは、PortBの全ポートを出力に設定します。Bank1にあるTRISBレジスタを変更して出力に設定します。TRISBレジスタは、CLRF(fレジスタをゼロクリアする命令)で出力設定となります。
CLRF TRISB
「TRISBレジスタをゼロクリアする。すなわち、PORTB全ポートを出力に設定する」
(6)Bank 0 へ戻す
動作モードの設定後は、Bank0に戻しておきます。Bank1へ切り替えるためには、RP0ビットを「0」にします。(RP1はデフォルトで「0」なので変える必要はない。)
BCF STATUS,RP0
「STATUS」レジスタのRP0ビットを「0」にする。すなわち、Bank0に戻す。」
(7)11111111を Wreg にロード
全ポートを「High」出力するため、11111111を (すなわち16進表示で、FF)を、Wregにロードする。
MOVLW 0FFH
「11111111をWregにロードする」
(注)数値の書式ですが、16進数表示は数字の後ろにHをつけます。
(例)9FH
ただし、16進数の先頭文字が、A,B,C,D,E,Fの場合は、先頭に0を付けないと、MPLABのBuildでエラーになります。先頭文字が1〜9のときはOK
(例) × B9H → ○ 0B9H とする
(例) ○ 54H
その他の書式としては、
(例) H’9F’ H’9f’ 0xA9 0xFB
という書式も使えます。表2は数値の書式についてまとめています。
種類 | 書式 | 使用例 |
10進数 | D'<digits>' | D'169' |
16進数 | H'<hex_digits>' 0x<hex_digits> 0<hex_digits>H |
H'A9' 0xA9 0A9H |
8進数 | O'<octal_digits>' | O'367' |
2進数 | B'<binary_digits>' | B'00011001' |
ASCII | '<character>' A'<characters>' |
'F' A'F' |
(8)PORTへWregのデータを出力
実際に出力するには、MOVWFなどの転送命令や、BSFなどのビット操作命令を使います。
MOVWF PORTB
「PORTBへWregのデータを出力する」
(9)終了
「END」はソースの終わりを示す必ず必要な擬似命令で、アセンブラに対し、ここがソースの終わりであることを知らせる役割があります。
END
「ソースプログラムの終わりであることを示す。」
<ソースコード書き方の注意>
ソースコードの書式は、下記に示す基本フォーマットで書きます。
Label Mnemonic Operand Comment
Label :(目印用の名前)
Labelは、各行の先頭から始めます。
含まれる文字は、アルファベットかアンダーバー(_)で始まる英数字でなければなりません。Labelは32文字以下の長さまでで、大文字、小文字の区別があります。ただし、大小文字の区別はMPLABの環境設定で無くすこともできます。
Mnemonic:(命令そのものの記号)
アセンブラー命令と指示命令(擬似命令)は、行の先頭から1個以上のスペースが必要です。Labelがある場合は、Labelの次に1個以上のスペースかコロン(:)が必要です。
Operand:(命令の対象、アドレスなど)
OperandはMnemonicの次に1個以上のスペースかタブで分離します。
複数のOperandが必要な場合には「,」で分離します。
Comment:(メモ欄)
Commentはどこから始まってもよく、セミコロン(;)に続く文節は全てコメントとされます。
アセンブルではコメントは無視され、オブジェクトには何も出力されません。
1行は255文字以下で、それぞれの項は1個以上のスペースで分離します。また、1行に複数のフォーマットを「,」で区切って書けます。
RCポート:全LED点灯動作
RCポートの全LED点灯動作については、RBポートで使用したプログラムの一部を書き換えすることで対応できます。
ポートの設定では、
CLRF TRISB ;(5)PortB 全ポートを出力に設定
となっていた箇所を
CLRF TRISC ;(5)PortC 全ポートを出力に設定
として、RCポートに設定します。
また、出力データを
MOVWF PORTB ;(8)PORTBへWregのデータを出力
となっていた箇所を
MOVWF PORTC ;(8)PORTCへWregのデータを出力
とするだけです。
RCポート:全LED点灯動作プログラムについて
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「port_c.asm」 サイズ543バイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「port_c.hex」 サイズ46バイト
;***************************************************** ; Port C動作チェックプログラム ; Port Cの発光ダイオードを点灯させる ;***************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC ORG 0 BSF STATUS,RP0 CLRF TRISC BCF STATUS,RP0 MOVLW 0FFH MOVWF PORTC END |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 ; ;(3)プログラムの開始番地の指定 ;(4)Bank 1 へ切替 ;(5)PortC 全ポートを出力に設定 ;(6)Bank 0 へ戻す ;(7)11111111を Wreg にロードする ;(8)PORTCへWregのデータを出力 ;(9)終了 |
RDポート:全LED点灯動作
RDポートの全LED点灯動作については、RBポートで使用したプログラムの一部を書き換えすることで対応できます。
ポートの設定では、
CLRF TRISB ;(5)PortB 全ポートを出力に設定
となっていた箇所を
CLRF TRISD ;(5)PortD 全ポートを出力に設定
として、RDポートに設定します。
また、出力データを
MOVWF PORTB ;(8)PORTBへWregのデータを出力
となっていた箇所を
MOVWF PORTD ;(8)PORTDへWregのデータを出力
とするだけです。
RDポート:全LED点灯動作プログラムについて
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「port_d.asm」 サイズ543バイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「port_d.hex」 サイズ46バイト
;***************************************************** ; Port D動作チェックプログラム ; Port Dの発光ダイオードを点灯させる ;***************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC ORG 0 BSF STATUS,RP0 CLRF TRISD BCF STATUS,RP0 MOVLW 0FFH MOVWF PORTD END |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 ; ;(3)プログラムの開始番地の指定 ;(4)Bank 1 へ切替 ;(5)PortD 全ポートを出力に設定 ;(6)Bank 0 へ戻す ;(7)11111111を Wreg にロードする ;(8)PORTDへWregのデータを出力 ;(9)終了 |
REポート:全LED点灯動作
REポートの全LED点灯動作については、RBポートで使用したプログラムの一部を書き換えすることで対応できます。
ポートの設定では、
CLRF TRISB ;(5)PortB 全ポートを出力に設定
となっていた箇所を
CLRF TRISE ;(5)PortE 全ポートを出力に設定
として、REポートに設定します。
また、出力データを
MOVWF PORTB ;(8)PORTBへWregのデータを出力
となっていた箇所を
MOVWF PORTE ;(8)PORTEへWregのデータを出力
とするだけです。
ただしREポートのピン数は、RE0,RE1,RE2ピンの3ピンのみです。
したがって、
MOVLW 0FFH ;(7)11111111を Wreg
にロードする
となっていた箇所を
MOVLW 07H ;(7)00000111を Wreg
にロードする
と変更します。
(注)0FFHのままで変更しなくても、MPLABはエラーにはなりませんし、RE0〜2ピンのLEDが点灯します。
REポート:全LED点灯動作プログラムについて
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「port_e.asm」 サイズ542バイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「port_e.hex」 サイズ46バイト
;***************************************************** ; Port E動作チェックプログラム ; Port Eの発光ダイオードを点灯させる ;***************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC ORG 0 BSF STATUS,RP0 CLRF TRISE BCF STATUS,RP0 MOVLW 07H MOVWF PORTE END |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 ; ;(3)プログラムの開始番地の指定 ;(4)Bank 1 へ切替 ;(5)PortE 全ポートを出力に設定 ;(6)Bank 0 へ戻す ;(7)00000111を Wreg にロードする ;(8)PORTEへWregのデータを出力 ;(9)終了 |
RAポート:全LED点灯動作
RAポートの全LED点灯動作については、RBポートで使用したプログラムの一部を書き換えすることで対応できます。
ポートの設定では、
CLRF TRISB ;(5)PortB 全ポートを出力に設定
となっていた箇所を
CLRF TRISA ;(5)PortA 全ポートを出力に設定
として、RAポートに設定します。
また、出力データを
MOVWF PORTB ;(8)PORTBへWregのデータを出力
となっていた箇所を
MOVWF PORTE ;(8)PORTEへWregのデータを出力
とするだけです。
ただしREポートの数は、RA0〜RA5の6ポートのみです。
したがって、
MOVLW 0FFH ;(7)11111111を Wreg
にロードする
となっていた箇所を
MOVLW 3FH ;(7)00111111を Wreg
にロードする
と変更します。
(注)0FFHのままで変更しなくても、MPLABはエラーにはなりませんし、RA0〜5ピンのLEDが点灯します。
RA4ピンは、オープンドレイン出力です。!!
プルアップなどして外部で電圧を加える必要あり
RAポートの中でも、RA4ピンはオープンドレイン出力の特殊な回路になっています。したがって、RA4ピンを出力として使う場合には、プルアップするなど外部で電圧を加えてやる必要があるので、要注意です。もし、プルアップしないときは、図1のようにRA4ピンのLEDだけ点灯しません。
![]() |
図1.RA4ピンをプルアップしない場合 |
図2に、RA4ピンにプルアップ抵抗をつけた例を示します。
(注)RA4ピンはオープンドレイン出力ですので、LEDを点灯させる本来の使い方としては、10kΩのプルアップ抵抗のところに、LEDを200Ω程度のプルアップ抵抗を介して+5V電源と直列に接続するようにします。ここでのPICターゲットボード内のLEDは、LEDを接続したことによるRA4ピンへの影響が出ないように、バッファ回路などが接続され、RA4ピンの電圧レベルをチェックする目的でつけられています。
![]() |
図2.RA4ピンにプルアップ抵抗をつけた回路例 |
ターゲットボード上には、図3のように10ピンコネクタ・ケーブルを接続できるようにしています。ピンの内訳ですが、各ポートの8ピンと、GNDピン、+5Vピンで計10ピンとなっています。(ただし、RAポートは全6ピンですので、その他の2ピンはNCピンとしている。)
10ピンコネクタ・ケーブルですが、ターゲットボードとブレッドボード間を接続できるようにしています。図4は、ブレッドボード側でプルアップ抵抗を接続した例です。このように、ターゲットボード側の全ポートは、外部と自由に接続できるようになっていることと、ブレッドボードと組み合わせることにより、多目的な回路構成を実現することができます。
![]() |
![]() |
図3.ターゲットボード側 | 図4.ブレッドボード側 |
RAポート:全LED点灯動作プログラムについて
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「port_a.asm」 サイズ623バイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「port_a.hex」 サイズ46バイト
;***************************************************** ; Port A動作チェックプログラム(1) ; Port Aの発光ダイオードを点灯させる ; 全ポートを出力させるためには、 ; RA4ポートがプルアップされていること ;***************************************************** |
|
LIST P=PIC16F877 |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 ;(3)プログラムの開始番地の指定 ;(4)Bank 1 へ切替 ;(5)PortA 全ポートを出力に設定 ;(6)Bank 0 へ戻す ;(7)00111111を Wreg にロードする ;(8)PORTAへWregのデータを出力 ;(9)終了 |
さて、RA4ピンにプルアップ抵抗を接続した場合ですが、上記のプログラムを動作させる前(イレースされている状態のPIC)で、図5のようにRA4ピンがすでに点灯してしまっています。RA4ピンを除くピンは、LED点灯のプログラムを動作させることで変化が分かりますが、RA4ピンについては、その変化が分かりません。したがって、次に別途プログラムを検討する必要があります。
![]() |
![]() |
図5.PIC動作前 | 図6.PIC動作中 |
次へは、LEDをON−OFFさせるLED点滅プログラムを使って、RA4ポートの動作チェックをします。
![]() |
![]() |
![]() |